package peca;
import javax.swing.ImageIcon;

import estrutura.Celula;
import estrutura.Peca;


public class Torre extends Peca{
	
	public Torre(CorPeca corPeca) {
		 StringBuilder caminhoImagem = new StringBuilder("images/torre");
		 caminhoImagem.append(corPeca.sufix()).append(".png");
		 setImagem(new ImageIcon(getClass().getClassLoader().getResource(caminhoImagem.toString())));
		 setCor(corPeca);
		 setNome(corPeca == CorPeca.BRANCA ? TORRE_B : TORRE_P);
	}
	
	public Torre(){}

	@Override
	public boolean isMovimentoValido(Celula origem, Celula destino, Celula[][] celulas) {
		if(isRotaValida(origem, destino) && isNotPecaNoCaminho(origem, destino, celulas)){
			return true;
		}

		return false;
		}
	
	private boolean isRotaValida(final Celula origem, final Celula destino) {
		final boolean X = destino.getLinha()==origem.getLinha();
		final boolean Y = destino.getColuna()==origem.getColuna(); 		
		return X || Y;
	}

	private boolean isNotPecaNoCaminho(Celula origem, Celula destino, Celula[][] celulas) {
		
		final int Y = destino.getColuna()-origem.getColuna();
		final int X = destino.getLinha()-origem.getLinha();
		
		if(destino.getPeca()!=null && origem.getPeca().getCor()==destino.getPeca().getCor()){
			return false;
		}
		
		int linhaOrigem = origem.getLinha();
		int colunaOrigem = origem.getColuna();

		if(linhaOrigem==destino.getLinha()){
			while(Integer.signum(destino.getColuna()-colunaOrigem)==-1 ? colunaOrigem>destino.getColuna() : colunaOrigem<destino.getColuna()){
				colunaOrigem = colunaOrigem + Integer.signum(Y);	
				Celula celula = celulas[linhaOrigem][colunaOrigem];
				if(celula.getPeca()!=null && celula != destino){
					return false;
				}
			}			
		}else{
			while(Integer.signum(destino.getLinha()-linhaOrigem)==-1 ? linhaOrigem>destino.getLinha() : linhaOrigem<destino.getLinha()){
				linhaOrigem = linhaOrigem + Integer.signum(X);	
				Celula celula = celulas[linhaOrigem][colunaOrigem];
				if(celula.getPeca()!=null && celula != destino){
					return false;
				}
			}			
		}		
		return true;
	}			
}